package com.briup.day11;

import java.lang.annotation.*;

/**
 * 注解：是Java中的一种结构；
 * 通过注解能够标注Java类、变量、方法、属性等内容在什么时机要做什么事情；
 * 注解是通过标注给程序查看的，当程序发现某一个类、变量、方法等代码上标注了
 * 注解，那么就会根据该注解的解析器执行某些特定的任务
 * ==============
 * 注释：用于记录某个代码片段的功能作用的，
 * 注释因为在编译成字节码后就会消失，所以注释是给程序员自己看的
 */
// 标注在注解之上的注解，被叫做元注解
// 给注解添加文档
@Documented
// @Target注解，用于标注你定义的注解可以标注在哪些结构上
// 通过ElementType枚举类，指定放在哪些结构上，可以同时指定多个结构
@Target({ElementType.METHOD})
// @Retention注解，设置注解的保留策略，
// 如可以将注解保留在源码期、编译器、运行时时机
// 通过RetentionPolicy枚举类进行指定，只能指定一种时机
// RetentionPolicy.SOURCE表示只保留在源码期间，即在编码过程中需要对该注解进行解析
// RetentionPolicy.CLASS表示将注解保留到编译期，在编码编译过程中对该注解进行解析
// RetentionPolicy.RUNTIME表示将注解保留到运行时，在运行期间对该注解进行解析即可
@Retention(RetentionPolicy.RUNTIME)
public @interface Logger {
    // 在注解结构中，可以定义属性方法，用于接收你在使用注解时传入的参数
    String value() default "";
}


class Test05 {

    @Logger("记录test方法被调用执行的日志")
    public void test() {
        System.out.println("这是test方法");
    }

    public static void main(String[] args) throws NoSuchMethodException {
        Test05 test05 = new Test05();
        test05.test();

        Class<? extends Test05> aClass = test05.getClass();
        Logger logger = aClass.getMethod("test")
                .getAnnotation(Logger.class);
        System.out.println(logger.value());
    }
}